package com.atguigu.srb.core.controller.api;


import com.atguigu.srb.core.pojo.entity.UserAccount;
import com.atguigu.srb.core.service.UserAccountService;
import com.atguigu.srb.result.ResponseVo;
import com.atguigu.srb.util.JwtUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.Map;

/**
 * <p>
 * 用户账户 前端控制器
 * </p>
 *
 * @author Atguigu
 * @since 2024-04-15
 */
@Api(tags = "投资人充值接口")
@RestController
@RequestMapping("/api/core/userAccount")
public class ApiUserAccountController {
    @Resource
    private UserAccountService userAccountService;
    @ApiOperation("获取账户余额")
    @GetMapping("balance")
    public ResponseVo getBalance(@RequestHeader("token") String  token){
        Long userId = JwtUtils.getUserId(token);
        UserAccount userAccount = userAccountService.getOne(Wrappers.lambdaQuery(UserAccount.class)
                .eq(UserAccount::getUserId,userId));
        return ResponseVo.ok().addData("item",userAccount.getAmount());
    }
    @ApiOperation("生成一个自动提交的表单，让用户去访问hfb的充值接口")
    @GetMapping("/recharge")
    public ResponseVo recharge(@RequestHeader("token") String token,@RequestParam("chargeAmt") BigDecimal amount){
        String form = userAccountService.recharge(token,amount);
        return ResponseVo.ok().addData("form",form);
    }
    // http://192.168.1.110/api/core/userAccount/notify
    @ApiOperation("hfb充值完成后的回调接口")
    @PostMapping("notify")
    public String rechargeNotify(@RequestParam Map<String,Object> map){
        //  回调的充值操作，我们应该保证 `接口的幂等性`  为了防止hfb重复回调我们的充值接口(因为网络原因等，hfb如果没有收到正常响应)
        //  `接口的幂等性`  -->  接口的访问必须携带一次性的token，可以防止恶意攻击和网络异常导致的接口的重复调用。
        //  实现：
        //      方式一：  通过redis来缓存一次性的token，用过则删除
        //      方式二：  通过数据库来存储一次性的token的状态，没有则为0，用过则为1 (本项目采用trans_flow来实现)
//        map.forEach((k,v)->{
//            System.out.println("k = " + k + "---------" + "v = " + v);
//        });
        String res = userAccountService.rechargeNotify(map);
        return res;
    }
}

